#!/usr/bin/python
# -*- coding: utf8 -*-
import sys
import xmpp
import os

from plugin import init_plugin_system, get_plugins_by_handlers
##
## IL8N
import gettext
if os.name == 'nt':
    print "Not supported"
    sys.exit(1)
gettext.install("metabot",unicode=1)
## IL8N END
## LOADING PLUGINS
init_plugin_system({'plugin_path': 'plugins/', 'plugins': 'all'})
commands={}
## MESSAGES
help={'fr':{}}
#TODO:Refaire le système d'aide.. c'est à chié la.
## FIN MESSAGE
# Commande appele  chaque connexion
def presenceCB(dispatcher,mess):
    global conn
    #Nouvel utilisateur
    if mess.getType():
        print "Debug : " + mess.getType()
    if mess.getType() == "unavailable": 
        print "Transport indisponible ; Debug info : "
        print mess.getFrom()
        print mess
        print dir(mess)
    if mess.getType() == "subscribe":
        #On autorise toute personne qui le demande
        conn.Roster.Authorize(mess.getFrom())
        #Envoit message automatique
        conn.send(xmpp.protocol.Message(mess.getFrom(),_(u"Bonjour,\nVous avez été autorisé par le bot.\nTapez \"help\" pour commencer."),"chat"))

# Commande appele  chaque message recu
def messageCB(conn,mess):
    text=mess.getBody()
    user=mess.getFrom()
    user.lang=u'fr'
    #DEBUG
    print u"<" + unicode(user) + "> " + unicode(text)
    #TODO: supprimer les retours à la ligne
    if text.find(' ')+1: 
        command,args=text.split(' ',1)
    # Commande d'un seul mot
    else: 
        command,args=text,''
    cmd=command.lower()

    # Si la commande est contenus dans 'commands'
    handlers=get_plugins_by_handlers(cmd)
    if len(handlers) > 0: 
        for plugin in handlers:
            getattr(plugin,plugin.infos['cmd'])(conn,mess.getFrom(),cmd,args,mess,user.lang)
    #Sinon on retourne commande inconnue
    else: 
        conn.send(xmpp.protocol.Message(mess.getFrom(),_(u"Commande inconnue « %s ». Essayez « help »")%cmd,"chat"))

def StepOn(conn):
    try:
        conn.Process(1)
    except KeyboardInterrupt: return 0
    return 1

def GoOn(conn):
    while StepOn(conn): pass

if len(sys.argv)<3:
    print "Usage: loader.py username@server.net password"  
else:
    jid=xmpp.JID(sys.argv[1])
    user,server,password=jid.getNode(),jid.getDomain(),sys.argv[2]
    
    #Debug client
    conn=xmpp.Client(server,debug=[])
    #Secure=0 due to a bug in TLS library
    print _(u"Tentative de connexion à %s...") %server
    conres=conn.connect(secure=0)
    if not conres:
        print _(u"Impossible de se connecter à %s!") %server
        sys.exit(1)
    if conres<>'tls':
        print _(u"Impossible d'établir une connexion sécurisée.")
    authres=conn.auth(user,password,"bot")
    if not authres:
        print _(u"Impossible de se connecter à %s.")%server
        sys.exit(1)
    if authres<>'sasl':
        print _(u"SASL impossible sur %s.")%server
    ## Adding handlers in xmppy
    conn.RegisterHandler('message',messageCB)
    conn.RegisterHandler('presence', presenceCB)
    ## End of adding handlers in xmpppy
    conn.sendInitPresence()
    print _(u"Bot connecté et présent.")
    GoOn(conn)
